package com.warmheart.core.enums;

import java.util.HashMap;
import java.util.Map;

import javax.validation.constraints.NotNull;

/**
 * 
 * @ClassName: ResultCode
 * @Description: 
 *               响应码为整数型响应枚举类，操作成功200，操作失败500，系统默认类异常定义范围为30001~39999（绑定异常默认类型，例如
 *               ：业务异常、服务异常、未知异常 ），
 *               请求认证类异常定义范围为400~499，参数类异常定义范围为40001~49999，业务类异常定义范围为50001~59999
 * @author ZhangJianyang
 * @date 2025-06-16 09:37:02
 *
 */
public enum ResultCode implements WhEnum<Integer> {

    // 操作成功（操作成功标准返回）
    SUCCESS(200, "操作成功"),
    // 未分类异常（操作失败标准返回）
    FAILED(500, "操作失败"),
    // 业务操作异常（主动抛出的异常）
    BUSINESS_ERROR(30001, "业务异常"),
    // 服务器异常（服务运行过程中的异常）
    ERROR_SERVER(30002, "服务故障，请联系管理员"),
    // 未知异常（不可预测的服务器异常，一般为系统级别）
    UNKNOWN_SERVER(30003, "未知异常，请联系管理员"),
    // 无效请求
    INVALID_REQUEST(400, "无效请求"),
    // 认证失败
    UNAUTHORIZED(401, "登录失败或者登录已过期"),
    // 认证参数有误（这里特指登录过程中的参数校验）
    AUTH_INVALID_PARAMS(402, "认证参数有误"),
    // 没有相关权限
    FORBIDDEN(403, "没有访问权限"),
    // 页面无法找到或请求路径不匹配
    NOT_FOUND(404, "页面无法找到或请求路径不匹配"),
    // 非法访问（方法找不到）
    METHOD_NOT_ALLOWED(405, "非法访问"),
    // 请求过于频繁
    DUPLICATE_SUBMIT(406, "请求过于频繁"),
    // 账号异常
    ACCOUNT_NUMBER(414, "当前账号无效"),
    // 非法操作（操作用户身份异常）
    OPERATE_NOT_ALLOWED(415, "非法操作"),
    // 公共参数无效
    PARAM_PUBLIC_INVALID(40001, "公共参数无效"),
    // 必填参数无效
    PARAM_INVALID(40002, "必填参数无效"),
    // 参数不能为空
    PARAM_EMPTY(40003, "参数不能为空"),
    // 参数类型不匹配
    PARAM_MISMATCH(40004, "参数类型不匹配"),
    // JSON格式不正确
    PARAM_JSON_CONVERT_INVALID(40005, "数据格式不正确"),
    // 商户不存在
    INVALID_APPID(50001, "APPID不存在"),
    // 验签失败
    SIGN_INVALID(50002, "验签失败"),
    // 支付密码错误
    INVALID_PAY_PASSWORD(50003, "支付密码错误"),
    // 未实名认证
    NOT_REAL_AUTH(50004, "未实名认证"),
    // 余额不足
    NOT_HAS_BALANCE(50005, "余额不足"),
    // 余额不足
    INTEREST_ILLEGAL(50006, "该权益仅支持社保卡消费"),
    // 实名认证失败
    REAL_AUTH_FAIL(50007, "实名认证失败");

    private static final Map<Integer, ResultCode> map = new HashMap<Integer, ResultCode>();

    static {
        for (ResultCode obj : ResultCode.values()) {
            map.put(obj.value, obj);
        }
    }

    // 枚举值
    private Integer value;

    // 枚举描述
    private String desc;

    private ResultCode(Integer value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    @Override
    public Integer getValue() {
        return this.value;
    }

    @Override
    public String getDesc() {
        return this.desc;
    }

    @Override
    public WhEnum<Integer> fromCode(Integer code) {
        return map.get(code);
    }

    @Override
    public WhEnum<Integer> fromCode(Integer code, @NotNull WhEnum<Integer> whEnums) {
        ResultCode resultCode = map.get(code);
        if (resultCode == null)
            return whEnums;
        return resultCode;
    }

}
